#pragma once

#include <stdio.h>
#include <string.h>
#include "esp_vfs_fat.h"
#include "sdmmc_cmd.h"
#include "driver/sdmmc_host.h"
#include "esp_log.h"

#ifdef __cplusplus
extern "C" {
#endif

#define BSP_SD_CLK          (47)
#define BSP_SD_CMD          (48)
#define BSP_SD_D0           (21)

#define MOUNT_POINT              "/sdcard"
#define EXAMPLE_MAX_CHAR_SIZE    64

/**
 * @brief SD卡信息结构体
 */
typedef struct {
    char name[16];              /**< 卡名称 */
    char type[32];              /**< 卡类型 (SDIO MMC SDSC SDHC SDHC/SDXC) */
    char speed[64];             /**< 速度信息 */
    uint64_t size_mb;           /**< 容量（MB） */
    struct {
        int ver;                /**< CSD 版本 */
        int sector_size;        /**< 扇区大小（字节） */
        int capacity;           /**< 容量（扇区数） */
        int read_bl_len;        /**< 读块长度 */
    } csd;                      /**< CSD 信息 */
    struct {
        uint32_t bus_width;     /**< 总线宽度 */
    } ssr;                      /**< SSR 信息 (对于SD卡) 或 EXT CSD 信息 (对于MMC卡) */
} sd_card_info_t;

/**
 * @brief 初始化并挂载SD卡
 *
 * @param mount_point 挂载点路径
 * @param card 返回的SD卡信息
 * @return esp_err_t ESP_OK成功，其他值表示失败
 */
esp_err_t sd_card_init_and_mount(const char *mount_point, sdmmc_card_t **card);

/**
 * @brief 卸载SD卡
 *
 * @param mount_point 挂载点路径
 * @param card SD卡信息
 */
void sd_card_unmount(const char *mount_point, sdmmc_card_t *card);

/**
 * @brief 获取SD卡详细信息
 *
 * @param card SD卡信息
 * @param info 返回的SD卡详细信息
 * @return esp_err_t ESP_OK成功，其他值表示失败
 */
esp_err_t sd_card_get_info(sdmmc_card_t *card, sd_card_info_t *info);

#ifdef __cplusplus
}
#endif